#ifndef VL_PROP__H_
#define VL_PROP__H_

#include <memory>
#include <vector>
#include <map>
#include <unordered_map>
#include <string>
#include <cstdio>
#include "utils/vl_file.h"

namespace VL {

class VLProp;

/**
 * @Author: CimZzz
 * @Date: 2022-06-16 15:16:27
 * 
 * Virtual lightning 属性对象
 */
class VLProp {
public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-16 15:17:02
	 * 
	 *	属性类型 
	 */
	enum PropType {
		// 空节点类型
		Empty = 0,
		// 空白类型
		Root = 1,
		// 值类型
		Node = 2,
		// 数组类型
		Array = 3,
		// 映射表类型
		Map = 4,
	};
	
	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-16 15:17:43
	 * 
	 * 构造方法
	 * @param type 属性类型
	 */
	explicit VLProp(PropType type);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-16 20:30:11
	 * 
	 * 获取属性类型
	 * @return 返回属性类型
	 */
	PropType getType();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-16 20:18:47
	 * 
	 * 获取属性名
     * @return 返回属性名
	 */
	std::string getName();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-16 20:19:17
	 * 
	 * 设置属性名
	 * @param name 属性名
	 */
	void setName(std::string name);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:00:20
	 * 
	 * 判断当前节点是否为空节点
	 */
	virtual bool isEmpty();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-07-13 14:43:21
	 * 
	 * 判断当前节点是否为根结点
	 * @return 如果是返回 true
	 */
	bool isRoot();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-07-13 14:43:21
	 * 
	 * 判断当前节点是否为映射表
	 * @return 如果是返回 true
	 */
	bool isMap();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-07-13 14:43:21
	 * 
	 * 判断当前节点是否为数组
	 * @return 如果是返回 true
	 */
	bool isArray();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-07-13 14:43:21
	 * 
	 * 判断当前节点是否为单节点
	 * @return 如果是返回 true
	 */
	bool isNode();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-25 20:07:10
	 * 
	 * 判断当前节点是否为容器结点
	 * 
	 * @return 如果是返回 true
	 */
	bool isContainer();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-25 20:08:16
	 * 
	 * 克隆当前属性
	 * 
	 * @return 属性指针
	 */
	virtual VLProp* clone();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-27 14:35:29
	 * 
	 * 获取属性值
	 * @return 属性值
	 */
	virtual std::string getValue();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-30 18:22:06
	 * 
	 * 比较两个 Array 之间的区别
	 * @param prop 属性指针
	 * @return 如果相同返回 true
	 */
	virtual bool diff(VLProp* prop);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-30 18:22:06
	 * 
	 * 比较两个 Array 之间的区别
	 * @param prop 属性指针
	 * @return 如果相同返回 true
	 */
	bool diff(std::shared_ptr<VLProp> prop);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-30 19:14:40
	 * 
	 * 组合属性
	 * @param prop 属性指针
	 * 
	 * @return 组合成功返回 false
	 */
	virtual bool combine(std::shared_ptr<VLProp>& prop);


	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 11:04:46
	 * 
	 * 构建属性打印信息
	 */
	virtual std::string buildPropPrintInfo();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 10:53:58
	 * 
	 * 打印属性节点信息
	 */
	void print();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 15:16:41
	 * 
	 * 打印属性节点信息, 设置前缀
	 * @param prefix 前缀
	 */
	virtual void printWithPrefix(std::string prefix);

protected:

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-21 10:58:20
	 * 
	 * 空节点
	 */
	static std::shared_ptr<VLProp> EMPTY;

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-16 20:19:46
	 * 
	 * 节点属性名
	 */
	std::string name;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-16 20:31:27
	 * 
	 * 属性类型
	 */
	PropType type;
};

}


#endif // VL_PROP__H_
